package com.yusys.pattern.regular.replace;

import java.util.HashMap;
import java.util.Map;

/**
 * 在一个Invoker类中关联了一个父类，调用了一个父 类的方法，
 * 子类可以覆写这个方法，也可以重载这个方法的前提是：要扩大这个前置条件，
 * 就是输入参数的类型宽于父类的类型覆盖范围
 */
public class Client {
    public static void main(String[] args) {
        invoker();//正确用法，父类被执行
        invokerSon();
        invokerSonParam();
    }

    private static void invoker() {
        Father father = new Father();
        HashMap map = new HashMap();
        father.doSomething(map);
    }

    /**
     * 注意这里的传入的参数范围比方法的参数范围大，是不能编译通过的，这种用法是错误的
     */
//    private static void invokerParam() {
//        Father father = new Father();
//        Map map = new HashMap();
//        father.doSomething(map);
//    }

    /**
     * 根据里氏替换原则，父类出现的地方都可以替换成子类
     * 结果任然是父类被执行，子类重载方法不会被执行，注意本方法内部的传参范围
     */
    private static void invokerSon() {
        Son son = new Son();
        //作为参数的 该引用类型是hashmap，被继承自父类的方法拦截，因为该方法范围更小
        //所以结果任然是：父类被执行
        HashMap map = new HashMap();
        son.doSomething(map);
    }

    /**
     * 根据里氏替换原则，父类出现的地方都可以替换成子类
     * 结果是：子类被执行
     * 注意这里的 参数引用表示的类型Map,所以是被子类自己的方法执行
     */
    private static void invokerSonParam() {
        Son son = new Son();
        Map map = new HashMap();
        son.doSomething(map);
    }
}
